package inner;
class OuterClass {
    private int data1 = 1 ;
    int data2 = 2;
    public static int data3 = 3;

    /**
     *  实例内部类
     *  1. 如何获取 实例内部类的对象
     *          OuterClass.InnerClass innerClass = outerClass.new InnerClass();
     *  2. 实例内部类当中 不能有静态的成员变量. 非要定义，那么只能是被static final修饰的
     *  3. 在实例内部类当中，如何访问外部类当中，相同(名字)的成员变量？
     *          在实例内部类当中 获取外部类的this ： OuterClass.this.data1
     */
    //可以把下面的实例内部类InnerClass当成OuterClass的成员。(便于理解)
    class InnerClass {
        public int data1 = 111;
        public int data4 = 4;
        int data5 = 5;
        //public static int data6; //error
        //final修饰的是常量，常量在编译时候就确定了是10.
        public static final int data7 = 10;
        public void func() {
            System.out.println("InnerClass::func()");
            //下面为访问外部类中同名的成员变量。
            //第一种
            OuterClass outerClass = new OuterClass();
            System.out.println(outerClass.data1);
            //第二种
            System.out.println(OuterClass.this.data1);
            System.out.println("==================");
            System.out.println(this.data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data5);
            System.out.println(data7);
        }
    }
    public void test() {
        //static final int c = 0; error
        //static int c = 0;  error
        System.out.println("OuterClass::test()");
        InnerClass innerClass = new InnerClass();
        innerClass.func();


        //final int SIZE = 10;//定义常量,常量是在程序编译的时候确定的，一旦初始化 就不能进行修改了。
        //SIZE = 20; error
    }

}
public class Test {

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.func();
    }
    public static void main1(String[] args) {

       // OuterClass outerClass = new OuterClass();
        //System.out.println(outerClass.data1);

        //下面两种写法都可以
        //第一种
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        //第二种
        OuterClass.InnerClass innerClass2 = new OuterClass().new InnerClass();

        //InnerClass innerClass = new InnerClass(); error
    }
}